﻿
// MFCListDlg.cpp: 实现文件
//

#include "pch.h"
#include "framework.h"
#include "MFCList.h"
#include "MFCListDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CMFCListDlg 对话框



CMFCListDlg::CMFCListDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_MFCLIST_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMFCListDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_COMBO1, m_cob);
	DDX_Control(pDX, IDC_LIST1, m_list);
}

BEGIN_MESSAGE_MAP(CMFCListDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_CBN_SELCHANGE(IDC_COMBO1, &CMFCListDlg::OnSelchangeCombo1)
	ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CMFCListDlg::OnDblclkList1)
END_MESSAGE_MAP()


// CMFCListDlg 消息处理程序

BOOL CMFCListDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时，框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	m_cob.AddString("图标");
	m_cob.AddString("小图标");
	m_cob.AddString("列表");
	m_cob.AddString("报表");
	m_cob.SetCurSel(0);

	// 添加报表列名分类  InsertColumn
	m_list.InsertColumn(0, "名称", LVCFMT_LEFT, 150);
	m_list.InsertColumn(1, "修改日期", LVCFMT_LEFT, 150);
	m_list.InsertColumn(2, "类型", LVCFMT_LEFT, 150);
	m_list.InsertColumn(3, "大小", LVCFMT_LEFT, 150);

	// 添加经纬线 仅限报表
	m_list.SetExtendedStyle(LVS_EX_GRIDLINES);

	// 图片链表类对象
	CImageList* pImgList = new CImageList;
	// 参数分别为(图片资源，宽度，如果图像不够每次增加大小，屏蔽的颜色)
	pImgList->Create(IDB_BITMAP1, 24, 1, RGB(255, 255, 255));

	// 将图像链表应用在列表控件的图标风格中
	m_list.SetImageList(pImgList, LVSIL_NORMAL);
	m_list.SetImageList(pImgList, LVSIL_SMALL);

	// 使用C盘的数据
	ShowFile("c:");

	/* 测试数据
	// 添加选项 InsertItem
	// 参数分别为(第几行，名称，使用图标列表第几列)
	m_list.InsertItem(0, "目录1", 0);
	// 设置文本内容 第几行第几列
	m_list.SetItemText(0, 1, "2024.7.3");
	m_list.SetItemText(0, 2, ".cpp");
	m_list.SetItemText(0, 3, "3M");

	m_list.InsertItem(1, "目录2", 1);
	m_list.SetItemText(1, 1, "2024.7.4");
	m_list.SetItemText(1, 2, ".c");
	m_list.SetItemText(1, 3, "4M");

	m_list.InsertItem(2, "目录3", 0);
	m_list.SetItemText(2, 1, "2024.7.4");
	m_list.SetItemText(2, 2, ".py");
	m_list.SetItemText(2, 3, "1M");*/

	


	return TRUE;  // 除非将焦点设置到控件，否则返回 TRUE
}

// 如果向对话框添加最小化按钮，则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序，
//  这将由框架自动完成。

void CMFCListDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CMFCListDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}



void CMFCListDlg::OnSelchangeCombo1()
{
	// TODO: 在此添加控件通知处理程序代码

	// ModifyStyle(去掉的风格，想要的风格)
	switch (m_cob.GetCurSel())
	{
	case 0:  // 图标
		m_list.ModifyStyle(LVS_SMALLICON | LVS_LIST | LVS_REPORT, LVS_ICON);
		break;
	case 1:  // 小图标
		m_list.ModifyStyle(LVS_ICON | LVS_LIST | LVS_REPORT, LVS_SMALLICON);
		break;
	case 2:  // 列表
		m_list.ModifyStyle(LVS_SMALLICON | LVS_ICON | LVS_REPORT, LVS_LIST);
		break;
	case 3:  // 报表
		m_list.ModifyStyle(LVS_SMALLICON | LVS_LIST | LVS_ICON, LVS_REPORT);
		break;
	}
}

void CMFCListDlg::ShowFile(CString path)
{
	// 先删除所有元素
	m_list.DeleteAllItems();
	CString strPath = path;
	strPath += "/*.*";
	CFileFind find; // 文件搜索类对象
	bool gofind = find.FindFile(strPath);
	int i = 0;
	while (gofind)
	{
		gofind = find.FindNextFileA();   // 找到当前文件，保存到find成员变量中，返回下一个文件
		CString filename = find.GetFileName();
		//CString filepath = find.GetFilePath(); // 局部变量
		CString* filepath = new CString; // 需要堆内存放置被自动释放
		*filepath = find.GetFilePath();
		// 判断是否是文件夹
		if (find.IsDirectory())
		{
			// 设置每个元素的名字
			m_list.InsertItem(i, filename, 0);
			// 将实际路径作为附加数据添加
			m_list.SetItemData(i, (DWORD_PTR)filepath);
		}
		else // 否则就是文件，文件不需要实际路径
		{
			m_list.InsertItem(i, filename, 1);
			// 不需要实际路径的内存可以立即释放
			delete filepath;
		}
		i++;
	}
	find.Close();
}

// 双击列表控件事件
void CMFCListDlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)
{
	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	*pResult = 0;

	DWORD_PTR data = m_list.GetItemData(pNMItemActivate->iItem); // 双击的选项item的附加数据
	CString* filepath = (CString*)data;  // 将附加数据转换成字符串形式的地址
	if(filepath!=NULL)
		ShowFile(*filepath);  // 打开指定路径下的文件夹
}
